package com.UdpRecieve.Netty.util.FileApproval;

import com.UdpRecieve.domain.SysFileType;
import com.UdpRecieve.domain.VerifyFileType;
import org.apache.poi.poifs.filesystem.FileMagic;


import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 检测文件类型,判断是否符合系统规定
 */
public class FileCheckType {

    /**
     * 根据文件流检测文件类型
     *
     * @param is           待检测文件流
     * @param sysFileTypes 系统设置文件类型
     * @param fileName     文件名称
     * @return 检查结果
     */
    public static String getFileType(InputStream is, List<SysFileType> sysFileTypes, String fileName) {
        String type = "";
        try {
            //
            type = VerifyFileType.getFileType((FileInputStream) is);
            if (type == null) {
                return "";
            }
            for (SysFileType sysFileType : sysFileTypes) {
                // 不相等就继续判断
                String value = sysFileType.getTypeValue();
                if (!type.equalsIgnoreCase(value)) {
                    continue;
                } else if (type.equalsIgnoreCase(value)) { // 相等就赋值给它，否则就是不存在
                    type = "yes";
                    break;
                }
            }
        } finally {
//            FileDetection.inputStreamThreadLocal.set(is);
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return type;
    }

    /**
     * 根据文件检测文件类型
     *
     * @param file         待检测文件
     * @param sysFileTypes 系统设置文件类型
     * @return 检查结果
     */
    public static String getFileType(File file, List<SysFileType> sysFileTypes) {
        String type = "";
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            type = getFileType(inputStream, sysFileTypes, file.getName());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return type;
    }

    /**
     * 根据文件检测文件类型,供压缩包文件使用
     *
     * @param file         待检测文件
     * @param sysFileTypes 系统设置文件类型
     * @return 检查结果
     */
    public static String getPackageFileType(File file, List<SysFileType> sysFileTypes) {
        String result = "";
        String fileName = file.getName();
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        // 先对文件后缀进行检测
        for (SysFileType sysFileType : sysFileTypes) {
            // 不相等就继续判断
            String value = sysFileType.getTypeValue();
            if (!suffix.equalsIgnoreCase(value)) {
                continue;
            } else if (suffix.equalsIgnoreCase(value)) { // 相等就赋值给它，否则就是不存在
                result = suffix;
            }
        }
        return result;
    }

    /**
     * 根据文件流判断文件类型，检测office文件
     *
     * @param inputStream 文件流
     * @return 文件类型枚举对象
     */
    public static Map<String, Object> getFileType(InputStream inputStream) {
        Map<String, Object> result = new HashMap<>();
        inputStream = FileMagic.prepareToCheckMagic(inputStream);
        FileMagic fileMagic = null;
        try {
            fileMagic = FileMagic.valueOf(inputStream);
            result.put("fileMagic", fileMagic);
//            result.put("inputStream", inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                inputStream = null;
            }
        }
        return result;
    }
}